home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 683 / showlink / showlink.mod < prev    next >
Text File  |  1995-03-18  |  4KB  |  180 lines

  1.  
  2. (**********************************************************************
  3.  
  4.     :Program.    Showlink
  5.     :Contents.   Shows AmigaDos file links
  6.     :Author.     Christoph Teuber
  7.     :Address.    Rheinstr. 65, 5600 Wuppertal 1, West-Germany
  8.     :Copyright.  Freeware
  9.     :Language.   Oberon
  10.     :Translator. Amiga-Oberon-Compiler V 2.12e
  11.     :History.    V1.0, 11.11.1991
  12.     :History.    V1.1, 18.08.1992 (cht)
  13.     :Kickstart   2.04 or higher
  14.  
  15. **********************************************************************)
  16.  
  17.  
  18. MODULE ShowLink;
  19.  
  20. IMPORT Exec,
  21.        io,
  22.        SYSTEM,
  23.        Dos,
  24.        u : Utility,
  25.        Strings,
  26.        a : Arguments;
  27.  
  28. TYPE ArgDummy = ARRAY 1 OF LONGINT;
  29.  
  30. CONST LinkNameLength = 20;
  31.  
  32. VAR Pfad : Dos.FileLockPtr;
  33.     ok : BOOLEAN;
  34.     vstring : ARRAY 40 OF CHAR;
  35.  
  36. PROCEDURE ParseArgs (VAR Lock : Dos.FileLockPtr) : BOOLEAN;
  37.  
  38. VAR rdargs : Dos.RDArgsPtr;
  39.     str : Exec.STRPTR;
  40.     oldLock : Dos.FileLockPtr;
  41.  
  42. BEGIN
  43.  
  44.  str := NIL;
  45.  rdargs := Dos.ReadArgs ("Dir", SYSTEM.VAL (ArgDummy, str), NIL);
  46.  IF rdargs = NIL THEN
  47.    RETURN (FALSE)
  48.  ELSE
  49.    IF str = NIL THEN
  50.      Lock := Dos.DupLock(a.oldCurrentDir);
  51.    ELSE
  52.      Lock := Dos.Lock (str^, Dos.sharedLock);
  53.      IF Lock = NIL THEN
  54.        RETURN (FALSE);
  55.      ELSE
  56.        oldLock := Dos.CurrentDir(Lock);
  57.      END;
  58.    END;
  59.  END;
  60.  RETURN (TRUE);
  61.  
  62. END ParseArgs;
  63.  
  64.  
  65. PROCEDURE ReadListe (MyLock : Dos.FileLockPtr);
  66.  
  67. VAR MyFib : Dos.FileInfoBlockPtr;
  68.     LinkLock : Dos.FileLockPtr;
  69.     NameLink : ARRAY 108 OF CHAR;
  70.     allesInButter, ok, onlyFile : BOOLEAN;
  71.     oldErr : LONGINT;
  72.  
  73. PROCEDURE Ausgabe (Fib : Dos.FileInfoBlockPtr; MyLock : Dos.FileLockPtr);
  74.  
  75. VAR Laenge : INTEGER;
  76.     ok : BOOLEAN;
  77.     RealName : ARRAY 108 OF CHAR;
  78.  
  79.  
  80. PROCEDURE FollowLink (VAR RealName : ARRAY OF CHAR; Name : ARRAY OF CHAR)
  81.                       : BOOLEAN;
  82.  
  83. VAR LinkLock : Dos.FileLockPtr;
  84.     dummyName : ARRAY 108 OF CHAR;
  85.     ok : BOOLEAN;
  86.  
  87.  
  88. BEGIN
  89.  
  90.   LinkLock := Dos.Lock(Name, Dos.sharedLock);
  91.   IF LinkLock = NIL THEN
  92.     RETURN (FALSE);
  93.   END;
  94.  
  95.   ok := Dos.NameFromLock(LinkLock, dummyName, SYSTEM.SIZE(dummyName));
  96.   Dos.UnLock(LinkLock);
  97.   IF ok THEN
  98.     COPY (dummyName, RealName);
  99.     RETURN (TRUE);
  100.   ELSE
  101.     RETURN (FALSE);
  102.   END;
  103.  
  104. END FollowLink;
  105.  
  106.  
  107. BEGIN
  108.  
  109.  io.WriteString (Fib^.fileName);
  110.  Laenge := Strings.Length (Fib.fileName);
  111.  IF Laenge<LinkNameLength THEN
  112.    REPEAT
  113.     io.WriteString (" ");
  114.     INC(Laenge);
  115.    UNTIL Laenge=LinkNameLength;
  116.  END;
  117.  
  118.  ok := FollowLink (RealName, Fib^.fileName);
  119.  IF ok THEN
  120.    CASE Fib.dirEntryType OF
  121.      Dos.linkFile : io.WriteString (" Hardlink TO  "); |
  122.      Dos.linkDir  : io.WriteString ("  Dirlink TO  ");
  123.    END;
  124.    io.WriteString (RealName);
  125.    io.WriteLn;
  126.  END;
  127.  
  128. END Ausgabe;
  129.  
  130.  
  131. BEGIN  (* ReadListe() *)
  132.  
  133.  MyFib := Dos.AllocDosObjectTags (Dos.fib, u.done);
  134.  IF MyFib = NIL THEN
  135.   oldErr := Dos.SetIoErr (Dos.noFreeStore);
  136.   HALT (5);
  137.  END;
  138.  
  139.  allesInButter := Dos.Examine (MyLock, MyFib^);
  140.  
  141.  IF allesInButter THEN
  142.    onlyFile := MyFib^.dirEntryType<0;
  143.    REPEAT
  144.      IF ((MyFib.dirEntryType = Dos.linkFile) OR
  145.          (MyFib.dirEntryType = Dos.linkDir))
  146.      THEN
  147.        Ausgabe (MyFib, MyLock);
  148.      END;
  149.      allesInButter := Dos.ExNext(MyLock, MyFib^);
  150.    UNTIL (NOT allesInButter OR onlyFile);
  151.  IF Dos.IoErr() = Dos.noMoreEntries THEN
  152.    oldErr := Dos.SetIoErr (0);
  153.  ELSE
  154.    HALT (5);
  155.  END;
  156.  END;
  157.  
  158.  IF MyFib#NIL THEN Dos.FreeDosObject (Dos.fib, MyFib) END;
  159.  
  160. END ReadListe;
  161.  
  162.  
  163. BEGIN (* Hauptprogramm *)
  164.  
  165.  vstring := "$VER: Showlink 1.1 (18.01.1992)";
  166.  IF Exec.exec.softVer>=37 THEN
  167.    IF ParseArgs(Pfad) THEN
  168.      ReadListe (Pfad);
  169.    END;
  170.  ELSE
  171.    io.WriteString("Requires Kickstart 2.04 or higher\n");
  172.  END;
  173.  
  174. CLOSE
  175.  
  176.  ok := Dos.PrintFault (Dos.IoErr(), "Showlink");
  177.  IF Pfad#NIL THEN Dos.UnLock(Pfad) END;
  178.  
  179. END ShowLink.
  180.